#include "Background.h"


const char stage[] = {
	'W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W',
	'W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W',
	'W',' ','W','W','W','W',' ','W','W','W','W','W','W',' ','W',' ','W','W','W','W','W','W',' ','W','W','W','W',' ','W',
	'W',' ','W','W','W','W',' ','W','W','W','W','W','W',' ','W',' ','W','W','W','W','W','W',' ','W','W','W','W',' ','W',
	'W',' ','W','W','W','W',' ','W','W','W','W','W','W',' ','W',' ','W','W','W','W','W','W',' ','W','W','W','W',' ','W',
	'W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W',
	'W',' ','W','W','W','W',' ','W','W',' ','W','W','W','W','W','W','W','W','W',' ','W','W',' ','W','W','W','W',' ','W',
	'W',' ','W','W','W','W',' ','W','W',' ','W','W','W','W','W','W','W','W','W',' ','W','W',' ','W','W','W','W',' ','W',
	'W',' ',' ',' ',' ',' ',' ','W','W',' ',' ',' ',' ','W','W','W',' ',' ',' ',' ','W','W',' ',' ',' ',' ',' ',' ','W',
	'W','W','W','W','W','W',' ','W','W','W','W','W',' ','W','W','W',' ','W','W','W','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W','W','W','W',' ','W','W','W',' ','W','W','W','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W',' ','W','W','W','W','W','W',
	' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
	' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',
	'W','W','W','W','W','W',' ','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W',' ','W','W','W','W','W','W','W','W','W',' ','W','W',' ','W','W','W','W','W','W',
	'W','W','W','W','W','W',' ','W','W',' ','W','W','W','W','W','W','W','W','W',' ','W','W',' ','W','W','W','W','W','W',
	'W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W',
	'W',' ','W','W','W','W',' ','W','W','W','W','W',' ','W','W','W',' ','W','W','W','W','W',' ','W','W','W','W',' ','W',
	'W',' ','W','W','W','W',' ','W','W','W','W','W',' ','W','W','W',' ','W','W','W','W','W',' ','W','W','W','W',' ','W',
	'W',' ',' ',' ','W','W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W','W',' ',' ',' ','W',
	'W','W','W',' ','W','W',' ','W','W',' ','W','W','W','W','W','W','W','W','W',' ','W','W',' ','W','W',' ','W','W','W',
	'W','W','W',' ','W','W',' ','W','W',' ','W','W','W','W','W','W','W','W','W',' ','W','W',' ','W','W',' ','W','W','W',
	'W',' ',' ',' ',' ',' ',' ','W','W',' ',' ',' ',' ','W','W','W',' ',' ',' ',' ','W','W',' ',' ',' ',' ',' ',' ','W',
	'W',' ','W','W','W','W','W','W','W','W','W','W',' ','W','W','W',' ','W','W','W','W','W','W','W','W','W','W',' ','W',
	'W',' ','W','W','W','W','W','W','W','W','W','W',' ','W','W','W',' ','W','W','W','W','W','W','W','W','W','W',' ','W',
	'W',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','W',
	'W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W','W'
};

Background::Background(void)
	:TILES_PER_BASE(29)
	,TILES_PER_HEIGHT(NUM_TILES / TILES_PER_BASE)
	,TILE_DIMENSION(16)//px
{
	numWall = 0;
	mBgElements = new BackgroundElement*[NUM_TILES];

	for(int i = 0; i < NUM_TILES; i++)
	{
		/*int row = i/TILES_PER_BASE, 
		col = i%TILES_PER_BASE;
		int lastRow = TILES_PER_HEIGHT-1,
		lastCol = TILES_PER_BASE  -1;*/
		if( stage[i] == 'W')
			/*i < stage->length() &&*/ 
			//(row == 0 || row == lastRow) 
			//||
			//((col == 0 || col == lastCol) && (row < 12 || row > lastRow - 12)) 
			//||
			//((col == TILES_PER_BASE/2) && (row != 5 || row != 11 || row != 18 || row != 24 || row != 31))
			//||
			//(row>2 && row < 6 && (col != 1 || col != 6 || col != 13 || col != lastCol-1 || col != lastCol-6 || col != lastCol-13))
			
		{
			mBgElements[i] = new BackgroundElement(WALL, (getCol(i)*TILE_DIMENSION), (getRow(i)*TILE_DIMENSION));
			++numWall;
		}
		else 
			{
			mBgElements[i] = new BackgroundElement(PATH, (getCol(i)*TILE_DIMENSION), (getRow(i)*TILE_DIMENSION));
		}
		
	}

	tilesImages[WALL]  = new Bitmap("data\\bg\\wall_blue.tga");
	tilesImages[PATH]  = new Bitmap("data\\bg\\empty.tga");
	//tilesImages[FIELD] = new Bitmap("data\\bg\\field.tga");
	//tilesImages[GROUND]= new Bitmap("data\\bg\\ground.tga");
	//tilesImages[ROCK]  = new Bitmap("data\\bg\\rock.tga");
	//tilesImages[SAND]  = new Bitmap("data\\bg\\sand.tga");

	tilesSpecImages[WALL] = new Bitmap("data\\bg\\wall_red.tga");
	tilesSpecImages[PATH] = new Bitmap("data\\bg\\rock.tga");
}


Background::~Background(void)
{
	for(int i = 0; i < BACKGROUND_COUNT; i++)
	{
		delete tilesImages[i];
		delete tilesSpecImages[i];
	}
	for(int i = 0; i < NUM_TILES; i++)
		delete mBgElements[i];
	delete [] mBgElements;
}

void Background::DrawTo(Bitmap* renderTarget, const bool specialActive, const int x, const int y) 
{
	hPadding = x;
	vPadding = y;

	Bitmap** arrayImg = /*(specialActive)? tilesSpecImages:*/ tilesImages;
	for(int i = 0; i < NUM_TILES; i++)
	{
		arrayImg[mBgElements[i]->getType()]->DrawTo(renderTarget, 
			hPadding + mBgElements[i]->getXcoord(), 
			vPadding + mBgElements[i]->getYcoord()	);
	}
}
void Background::DrawTo(Bitmap* renderTarget, const int x, const int y) 
{
	hPadding = x;
	vPadding = y;

	for(int i = 0; i < NUM_TILES; i++)
	{
		tilesImages[mBgElements[i]->getType()]->DrawTo(renderTarget, 
			hPadding + mBgElements[i]->getXcoord(), 
			vPadding + mBgElements[i]->getYcoord()	);
	}
}


const int Background::getRow(const BackgroundElement* bgTile) const
{
	if(bgTile->getYcoord() >= 0)
		return (bgTile->getYcoord() / TILE_DIMENSION);
	else
	{
		for(int i = 0; i < NUM_TILES; i++){
			if(mBgElements[i] == bgTile) 
				return getRow(i);
		}
	}
	return -1;
}

const int Background::getCol(const BackgroundElement* bgTile) const
{
	if(bgTile->getXcoord() >= 0)
		return (bgTile->getXcoord() / TILE_DIMENSION);
	else
	{
		for(int i = 0; i < NUM_TILES; i++){
			if(mBgElements[i] == bgTile) 
				return getCol(i);
		}
	}
	return -1;
}
const int Background::getRow(const int bgTileIndex) const
{
	return (bgTileIndex / TILES_PER_BASE);
}
const int Background::getCol(const int bgTileIndex) const
{
	return (bgTileIndex % TILES_PER_BASE);
}


const int Background::getIndex(const BackgroundElement* bgTile) const
{
	for(int i = 0; i < NUM_TILES; i++){
		if(mBgElements[i] == bgTile) 
			return i;
	}
	return -1;
}
BackgroundElement* Background::getTile(const int tileIndex) const
{
	if(tileIndex < NUM_TILES && tileIndex > -1) 
		return mBgElements[tileIndex];
	return nullptr;
}